import { AbstractControl } from '@angular/forms'

export interface NumberOptions {
  /**
   * 是否可以小于0 default = true
   */
  whetherLessThanZero?: boolean
  /**
   * 限制几位小数 default = 2
   */
  decimalPlaces?: number
  /**
   * 错误语句 default = 格式不正确
   */
  message?: string
}

/**
 * 是否为数字
 * @param options
 * @returns
 */
export function number(options: NumberOptions = {}) {
  const { decimalPlaces = 2, whetherLessThanZero = true, message = '格式不正确' } = options
  const validator = (control: AbstractControl) => {
    const reg = new RegExp(
      `^(${whetherLessThanZero ? '-[0-9][0-9]*|' : ''}[0-9][0-9]*)+(.[0-9]{1,${decimalPlaces}})?$`
    )
    let value: string = ''
    if (control.value !== null || control.value !== undefined) {
      value = control.value?.toString()
    }
    if (reg.test(value)) {
      if (value.startsWith('00') || value.startsWith('-00')) {
        return { [message]: true }
      }
      return null
    }
    if (value) {
      const [integer, decimal = ''] = value.split('.')
      if (decimal.length > decimalPlaces) {
        return { [`小数位数长度不能大于${decimalPlaces}`]: true }
      }
    }
    return { [message]: true }
  }
  return validator
}
